package com.cj.common.entity;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

/**
 * 统一定义id的entity基类.
 * 
 * 基类统一定义id的属性名称、数据类型、列名映射及生成策略. 子类可重载getId()函数重定义id的列名映射和生成策略.
 * 
 * @author calvin
 */
//1，CacheConcurrencyStrategy.NONE 不适用，默认
//2.　 CacheConcurrencyStrategy.NONSTRICT_READ_WRITE 更新不频繁几个小时或更长
//3，CacheConcurrencyStrategy.READ_ONLY 对于不发生改变的数据使用
//4，CacheConcurrencyStrategy.READ_WRITE 基于时间戳判定机制，，对于数据同步要求严格的情况，使用频繁
//5，CacheConcurrencyStrategy.TRANSACTIONAL 运行在jta环境种，基于事务
//
// @Column(name="...") 该属性对应表中的字段是什么，没有name表示一样
// @Table 对象与表映射
// @UniqueConstraint 唯一约束
// @Version 方法和字段级，乐观锁用法，返回数字和timestamp，数字为首选
// @Transient 暂态属性，表示不需要处理
// @Basic 最基本的注释。有两个属性：fetch是否延迟加载，optional是否允许null
// @Enumerated 枚举类型
// @Temporal 日期转换。默认转换Timestamp
// @Lob 通常与@Basic同时使用，提高访问速度。
// @Embeddable 类级，表可嵌入的
// @Embedded 方法字段级，表被嵌入的对象和@Embeddable一起使用
// @AttributeOverrides 属性重写
// @AttributeOverride 属性重写的内容和@AttributeOverrides一起嵌套使用
// @SecondaryTables 多个表格映射
// @SecondaryTable 定义辅助表格映射和@SecondaryTables一起嵌套使用
// @GeneratedValue 标识符生成策略，默认Auto
// JPA Entity基类的标识
@MappedSuperclass
public abstract class IdEntity {

	private Long id;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}
	@Override
	public boolean equals(Object obj) {
		if(obj == this)
			return true;
		if (obj == null)
			return false;
		if (!(this.getClass().isInstance(obj) && obj.getClass().isInstance(this)))
			return false;
		IdEntity instance = (IdEntity) obj;
		if (instance.getId() == null)
			return false;
		else
			return instance.getId().equals(this.getId());
	}
	
	@Override
	public int hashCode() {
		return getId().hashCode();
	}	
}
